perm filename JUSTFY.F4[NEW,LCS]7 blob
sn#372834 filedate 1978-08-09 generic text, type T, neo UTF8
00010 C*************** SUBROUTINE JUSTFY, FUNCTION OTHSID *************
00100 SUBROUTINE JUSTFY(JLP,R,IR,NO,NP,RN,RSTFAC,R2,R4,R5,R6,R8,R9)
00200 CC IMPLICIT INTEGER(A-Q,S-Z)
00300 CC REAL EXTEN,PRCNT,ACCX,SPFAC
00400 COMMON /JSTFY/ROV,PRCNT,RJSZ/KJY/ KY,JY
00500 CC COMMON /STF/RSTFAC(0/7),RSTJ2 /JSTFY/ROV,PRCNT,RJSZ/KJY/ KY,JY
00600 DIMENSION IR(2,250),R(2,250),RN(1),NO(1),NP(1),RSTFAC(0/1)
00700 CC DATA RSP/.5/,RI/4.5/
00800 CC RSP=.5
00900 SPFAC=.5
01000 DO 11 KN=0,JLP
01100 RSPC=0
01200 R8=KN
01300 N=0
01400
01500 DO 2 K=1,KY
01600 L=NP(K)
01700 RL=RN(L)
01800 RA=RN(L+1)
01900 RB=RN(L+3)
02000 IF(RN(L+2).EQ.R8)GO TO 77
02100 C THIS STAFF?
02200 IF(RA.NE.4)GO TO 2
02300 C SKIPS HOMED NOTES (IN CHORDS)
02600 77 IF(RA.LT.3)GO TO 20
02700 IF(RA.EQ.4)GO TO 444
02800 IF(RA.EQ.3)GO TO 333
02900 C LOOKS AT NOTES,RESTS,CLEFS,BAR LINES,KSIGS,METERS.
03000 IF(RA.LT.17)GO TO 2
03100 GO TO 10
03200 333 IF(RL.LT.3)GO TO 10
03300 C <3 MEANS NOTHING IN P5
03400 IF(RN(L+5).GT.4)GO TO 2
03500 C NOT A REAL CLEF IF >4 (0=TREB, 1=BASS, 2=ALT, 3=TEN, 4=PERC.)
03600 GO TO 10
03700 444 IF(RL.GT.3)GO TO 2
03800 CC FOR REPEAT BAR WDCNT IS 3 -- 10/77 444 IF(RL.GT.2)GO TO 2
03900 C SHOULD CHECK ON BAR LINES NO MATTER WHICH STAFF
04000 GO TO 10
04100 20 IF(RA.NE.2)GO TO 10
04200 IF(RN(L+6))GO TO 2
04300 C SKIP INVISIBLE RESTS. (PUT THIS IN OTHER JUST. PROGS.)
04400 10 N=N+1
04500 R(1,N)=RB
04600 IR(2,N)=L
04700 IF(N.EQ.250)GO TO 28
04800 C ONLY TREATS 250 ITEMS AT A TIME.
04900 2 CONTINUE
05000
05100 IF(N.EQ.0)GO TO 11
05200 28 DO 23 K=1,N
05300 23 IF(RN(IR(2,K)+1).NE.4)GO TO 24
05400 C SKIPS IF ONLY BAR LINES ON THIS STAFF
05500 GO TO 11
05600 24 RSZ=RSTFAC(KN)*PRCNT
05900 CALL SORT2(R,N)
06000
06100 C JUMP IF LAST IS A BAR LINE.
06200 K=0
06300 JLDGR=0
06400 JX=0
06500 22 K=K+1
06600 122 L=IR(2,K)
06700 RA=RN(L+1)
06800 C RA IS NOW CODE NUM.
06900 RB=0
07000 RD=0
07100 C RD WILL HOLD SPACE TO ADD TO PREV. ITEM, IF NEEDED.
07200 RX=RN(L+5)
07300 C RX=PARAM 5
07400 RX6=RN(L+6)
07500 RY=1
07600 RW=AMOD(RN(L+4),100.)
07700 RSP=SPFAC*RSTFAC(IFIX(RN(L+2)))
07800 IF(RA.GT.1)GO TO 4
07900 RZ=RN(L+7)
08000 IF(LDGR.NE.JLDGR)JLDGR=0
08050 C CHECK FOR PRESENCE OF LEDGER LINES WITH SUCCESSIVE NOTES
08100 LDGR=0
08200 JK=K
08300 DO 32 JJ=JK+1,N+1
08400 K=JJ
08500 RB=R(1,JJ)-R(1,JJ-1)
08600 IF(RB.GT.0.1)GO TO 320
08700 C PUTS THEM AT EXACT SAME POINT IF CLOSER THAN .1
08800 R(1,JJ)=R(1,JJ-1)
08900 GO TO 32
09000 320 IF(RB.GT.RSP)GO TO 35
09100 32 CONTINUE
09200 C FOUND HOW MANY MEMBERS TO CHORD.
09300 35 RB=0
09400 K=K-1
09500 RQ=0
09700 125 RC=ABS(RN(L+4))
09800
09900 IF(RC.LT.60)GO TO 637
10000 IF(RC.LT.180)RY=.6
10100 C FOUND A MINI-NOTE
10200
10300 637 RSDF=0
10400 IF(RA.EQ.1)GO TO 437
10500 C JUMP IF NOTE
10600 RDF=-1
10700 C NOW IT'S ANYTHING BUT A NOTE
10800 GO TO 137
10900 437 IF(RN(L).LT.8)GO TO 237
11000 C JUMP IF THERE IS NOT P10 TO LOOK AT
11100 RW=RN(L+10)
11200 C PUT P10 INTO RW
11300 GO TO 337
11400 237 RW=0
11500 337 IF(RDF.LT.0)GO TO 537
11600 C JUMP IF PREVIOUS WAS NOT A NOTE
11700 IF(RW.EQ.RDF)GO TO 137
11800 C SKIP TO FAR END OF LOOP IF THINGS ARE ON DIFF. STAVES. (CLEFS?, ETC?)
11900 RSDF=-1
12200 537 RDF=RW
12300 C SAVE STAFF INFO FOR NEXT TIME AROUND.
12400
12600 137 DO 37 JJ=JK,K
12700 C******* IF(RD.NE.0)GO TO 38
12800 C FINDS ONLY HIGH OR! LOW LED. LINE.
12900 JR=IR(2,JJ)
13000 RW=AMOD(RN(JR+4),100.)
13100 IF(RW.GT.12)GO TO 277
13200 IF(RW.GE.2)GO TO 38
13300 277 LDGR=-1
13400 IF(RW.GT.11)LDGR=1
13500 IF(JLDGR.EQ.LDGR)GO TO 36
13600 JLDGR=LDGR
13700 C LDGR IS FOR LEDGER LINES.
13800 GO TO 38
13900 36 IF(RD.GE.1.5)GO TO 38
14000 RD=1.5
14100 RQ=RD
14200 38 IF(RB.GT.2)GO TO 222
14300 C JUMP IF LARGE SPACE AFTER NOTE IS ALREADY SET UP.
14400 RZZ=RN(JR+7)
14500 RE=RN(JR+5)
14800 IF(RB.GE.2)GO TO 477
14900 RC=1.5
15000 IF(RZZ.LT.10)GO TO 378
15100 IF(RZZ.GE.20)RC=3.
15200 C 10=DOT, 20=DOUBLE DOT
15300 GO TO 377
15400 378 IF(RE.GE.20)GO TO 477
15500 IF(AMOD(RZZ,10.).EQ.0)GO TO 477
15600 377 RB=RC+EXTEN(RZZ)
15700 C SPACE FOR DOT OR TAIL(IF STEM UP)
15800 477 IF(ABS(RN(JR+6)).EQ.10)RB=RB+2
15900 C FOR CHORD TONES ON RIGHT OF STEM UP.
16000 C LOOKS THROUGH ALL NOTES OF A CHORD.
16100 222 RC=AMOD(RE,10.0)
16200 IF(RC.EQ.0)GO TO 37
16300 C JUMP IF NO ACCIS. NOW SEE IF THERE'S SPACE FOR ACCI.
16400 IF(RN(JIR+1).NE.1)GO TO 425
16500 C* RX=0
16600 C* IF(RN(JR).GE.8)RX=RN(JR+10)
16700 C* RXX=0
16800 C* IF(RN(JIR).GE.8)RXX=RN(JIR+10)
16900 C* RDF=0
17000 C* IF(RX.NE.RXX)RDF=100.
17100 C SAVE INFO ON NOTES ON DIFF. STAVES.
17200 C* IF(RXX.EQ.1.OR.RX.EQ.2)RDF=-RDF
17300 C**** THIS NEXT AREA PROBABLY NEEDS MORE WORK (2/78) ***********
17400 C JIR IS POINTER TO PREVIOUS ITEM. SKIP IF NOT A NOTE.
17500 KX=RC
17600 C KX=ACCI ON CURRENT NOTE
17700 RD=1
17800 C ADD A LITTLE SPACE FOR ACCI. ANYHOW.
17900 RX=RN(L+4)
18000 RXX=ABS(RX)
18100 C THIS NOTE
18200 577 IF(RXX.LT.80)GO TO 677
18300 C FIND MINIS, HARMONICS, ETC.
18400 RXX=RXX-100
18500 GO TO 577
18600 677 IF(RX)RXX=-RXX
18700 RX=RXX
18800 RDIF=RN(JIR+4)
18900 RXX=ABS(RDIF)
19000 777 IF(RXX.LT.80)GO TO 877
19100 C FIND MINIS, HARMONICS, ETC.
19200 RXX=RXX-100
19300 GO TO 777
19400 877 IF(RDIF)RXX=-RXX
19500
19600 RDIF=RX-RXX
19700 C HEIGHT DIFF. JUMP OUT IF TOO CLOSE TOGETHER. AMOD IS FOR GRACE NOTES, ETC.
19800 RX=3
19900 JSTM=RN(JIR+5)/10.0
20000 C JSTM=STEM DIRECTION OF PREVIOUS NOTE. 1=UP, 2=DOWN
20100 IF(RDIF.GT.0)GO TO 427
20200 C JUMP IF PREV NOTE IS BELOW. LIMITS: b OR NAT.=3, #=4
20300 IF(JSTM.NE.2)GO TO 424
20400 IF(AMOD(RN(JIR+7),10.0).GE.1)GO TO 425
20500 C JUMP IF PREV. NOTE HAS STEM DOWN WITH TAIL. THEN WE NEED SPACE.
20600 424 IF(KX.NE.2)RX=5
20700 GO TO 428
20800 427 IF(KX.EQ.2)RX=4
20900 C PREV NOTE IS ABOVE. LIMITS: b OR NAT.=5, #=3
21000 428 IF(ABS(RDIF).LT.RX)GO TO 425
21100 IF(RDIF)GO TO 426
21200 C JUMP IF THIS NOTE IS LOWER THAN PREV.
21300 IF(JSTM.NE.1)GO TO 426
21400 C NO BIG SPACE NEEDED IF PREV. NOTE HAS STEM DOWN AND IS BELOW.
21500
21600 425 RW=2.8
21700 IF(IFIX(AMOD(RE,10.0)).EQ.4)RW=4.8
21800 CATCHES DOUBLE FLAT (=4)
21900 RD=RW*RY+EXTEN(RE)+OTHSID(RN,JR)
22000 CGHB USE 2.8 FOR SIZE OF ACCIS (THEY'RE REALLY 3)425 RD=2*RY+EXTEN(RE)
22100 426 IF(RQ.GT.RD)RD=RQ
22200 RQ=RD
22300 C FUNCT. EXTEN=AMOD(X,1.)*10.
22400 37 CONTINUE
22500
22600 IF(RY.NE.1)RB=RB-.5*RJSZ
22700 C MINI NOTES NEED LESS SPACE
22800 250 IF(RSDF)GO TO 17
22900 ACCX=0
23000 CC RC=0
23100 JIR=JX+2
23200 IF(JIR.GE.N)GO TO 25
23300 RW=R(1,JIR-1)
23400
23500 DO 132 JJ=JIR,N
23600 IF(RW.NE.R(1,JJ))GO TO 25
23700 KX=IR(2,JJ)
23800 C GET POINTER
23900 IF(RN(KX+1).NE.1)GO TO 25
24000 C ONLY CHECK ON NOTES (THIS IS FOR CHRD NOTES WITH ACCIS)
24100 CC RE=ABS(RN(KX+6))
24200 CC IF(RE.GE.10)RC=-2.6
24300 CC IF(RE.EQ.20)RC=-RC
24350 RC=OTHSID(RN,KX)
24500 RE=AMOD(RN(KX+5),10.0)
24600 C FIND AN ACCI
24800 IF(RE.GE.1)RC=RC+2
24900 IF(IFIX(RE).EQ.4)RC=RC+2
25000 C FOUND AN ACCI RE=4=DOUBLE FLAT
25200 RC=AMOD(RE,1.0)*10.0+RC
25300 C ADD ANY EXTENSION TO THE LEFT
25400 IF(RC.GT.ACCX)ACCX=RC
25500 CC RC=0
25600 IF(ACCX.GT.RD)RD=ACCX
25700 132 CONTINUE
25800 GO TO 25
25900
26000 4 IF(RA.NE.2)GO TO 33
26100 C NEXT FOR DOTTED RESTS - IN P6
26200 IF(RN(L).GE.4)RB=RN(L+6)*1.5
26300 C NOW GO BACK TO SEE IF THERE IS A NOTE IN SAME HORIZ. POS.
26400 GO TO 250
26500 33 IF(RA.NE.3)GO TO 29
26600 RB=3
26700 IF(RN(L+4).GT.80)RB=1.5
26800 C CHECK ON SIZE NEEDED FOR CLEFS. >80 = MINICLEF
26900 29 IF(RA.NE.4)GO TO 26
27000 C BAR LINES
27200 RB=-RJSZ/2
27300 RD=.9
27400 GO TO 25
27500 26 IF(RA.NE.18)GO TO 30
27600 C METER
27700 RC=0
27800 IF(RN(L).GE.7)RC=9
27900 C FOR COMPOSITE METERS. NO CHECK FOR DBL DIGITS YET.
28000 RB=-1
28100 RD=1
28200 IF(RX6.LE.9.AND.RX.LE.9)GO TO 31
28300 C CHECKS FOR 2-DIGIT METERS
28400 RD=2
28500 RB=0
28600 31 RB=RB+RC
28700 GO TO 25
28800 30 IF(RA.NE.17)GO TO 17
28900 C KSIG
29000 RX=ABS(RX)
29100 IF(RX.GE.100)RX=RX-100
29200 C +100 FOR NATURALS AS KEYSIG.
29300 RB=2*(RX-1)-2
29500 C SPACES FOR CORRECT NUM OF ACCIS. RX=NUM OF ACCIS.
29600 RD=2
29700 25 IF(JX.GT.0)R(2,JX)=R(2,JX)+RD*RSZ
29800 17 RC=(RB+RJSZ)*RSZ
29900 C RJSZ=DEFAULT SIZE
30000 JIR=L
30100 C SAVE THE POINTER FOR ACCI. CHECK AT 110
30200 JX=K
30300 R(2,JX)=RC
30500 3 IF(K.LT.N)GO TO 22
30600 RA=R(1,1)
30700 RB=R(2,1)
30800
30900 DO 13 KX=2,JX
31000 RE=R(1,KX)
31100 C POS. BEFORE SHIFTING
31200 IF(ABS(RE-RA).GT..5)GO TO 14
31300 IF(R(2,KX).GT.RB)GO TO 16
31400 C SKIPS DOUBLE STOPS AND VERY CLOSE ITEMS
31500 GO TO 13
31600 C JUMP WHEN SPACE TO ADD IS SMALLER THAN WHAT'S ALREADY THERE
31700 14 RD=RA+RB-RE
31800 IF(RD.LE.0)GO TO 16
31900 C THERE'S ENOUGH ROOM
32000 ROV=ROV+RD
32100 140 R4=RE+RSPC-.001
32200 R5=10000
32300 R8=RD
32400 R9=0
32500 C GO EXPAND IT
32600 IF(R(2,KX).EQ.0)GO TO 15
32700 CALL MOVIT(RN,NO,R4,R5,R8,R9)
32800 C???? IF(R2.LE.4)GO TO 15
33000 C SKIP NEXT IF COMING FROM 'PAGE' OR 'JUST'
33100 IF(R2.LE.7)GO TO 15
33200 R5=R4
33300 R4=RA+.001+RSPC
33400 R8=R4
33500 R9=R5+RD-.001
33600 C FOR ITEMS ON OTHER LINES.
33700 CALL MOVIT(RN,NO,R4,R5,R8,R9)
33800 15 RSPC=RSPC+RD
33900 C RSPC SAVES TOTAL SPACE ADDED
34000 16 RB=R(2,KX)
34100 13 RA=RE
34200 11 CONTINUE
34300 END
34400
34500 FUNCTION OTHSID(RN,J)
34600 DIMENSION RN(1)
34700 OTHSID=0
34800 A=ABS(RN(J+6))
34900 IF(A.GE.10)OTHSID=-2.6
34950 C OTHSID=SPACE NEEDED (+ OR -) BECAUSE OF NOTE ON 'WRONG' SIDE OF STEM.
35000 IF(A.GE.20)OTHSID=-OTHSID
35100 END